#ifndef __DLIST_H__
#define __DLIST_H__

// 头文件内容
#include "head.h"
/**
 * 逻辑结构 双向循环链表
 * 存储结构 链式存储
 * 功能 : 用于实现对航班信息 的增 删 改 查 判空 清空 销毁 排序 文件写入  文件读取
 */

// 数据对象
typedef struct f_data
{
    int id;              // 航班班次
    char flighttype[20]; // 飞机机型
    char startcity[20];  // 航班起点站
    char arrivecity[20]; // 航班终点站
    int starttime[2];    // 起飞时间 时:分
    int arrivetime[2];   // 到达时间 时:分
    char flytime[20];    // 飞行时间
    int value;           // 票价
    int maxNUM;          // 额定载客量
    int leftbuyersa;     // 剩余座位数量
    char whetherfly;     // 是否起飞 ‘y’ ‘n’
} f_data;

// 航班信息节点 - 双向循环链表
typedef struct f_node
{
    f_data data;
    struct f_node *prev;
    struct f_node *next;
} f_node;

// 航班信息头结点
typedef struct f_list
{
    struct f_node *next;
} f_list;

// 双向链表的创建
f_list *init_double_link_list();

// 双向链表的插入
void insert_double_node(f_list *list, f_data data, int pos);
// 双向链表的插入(不写入文件版)
void insert_node_normal(f_list *list, f_data data, int pos);

// 双向链表的删除
void delete_double_node(f_list *list, int pos);

// 双向链表的查找
// 按位置查找
f_node *find_double_node_pos(f_list *list, int pos);
// 按起始站-终点站查找
void find_double_node_location(f_list *list, char *start_city, char *arrive_city);

// 判断是否有该班次航班
f_node *is_find_location(f_list *list, char *start_city, char *arrive_city);
// 根据班次查找
f_node *find_double_node_id(f_list *list, int *id);

// 双向链表的遍历
void print_forward_double_link_list(f_list *list,int sleep_time);
void print_backwards_double_link_list(f_list *list);
// 双向链表的判空
void is_empty_double_link_list(f_list *list);

// 双向链表的清空
void clear_double_link_list(f_list *list);

// 双向链表的合并
f_list *merge_double_link_lists(f_list *list1, f_list *list2);

// 双向链表的销毁
void free_double_link_list(f_list **list);

// 打印一条航班数据
void print_flight_1(f_node *p);

#endif